/**
 * @description reduce 根据条件过滤一组对象，同时过滤掉未指定的键。
 * @param {*} data 
 * @param {*} keys 
 * @param {*} fn 
 * @returns 
 */
const reducedFilter = (data, keys, fn) =>
  // 用于 Array.prototype.filter() 过滤数组，fn 以便它返回条件返回真值的对象。
  // 在过滤后的数组上，使用 Array.prototype.map() 返回新数组对象。
  data.filter(fn).map((el) =>
    // 使用 Array.prototype.reduce() 过滤掉不为所提供的关键keys参数。
    keys.reduce((acc, key) => {
      acc[key] = el[key];
      return acc;
    }, {})
  );

// 例子
const data = [
  {
    id: 1,
    name: "john",
    age: 24,
  },
  {
    id: 2,
    name: "mike",
    age: 50,
  },
];
reducedFilter(data, ["id", "name"], (item) => item.age > 24);
// [{ id: 2, name: 'mike'}]
